home *** CD-ROM | disk | FTP | other *** search
/ FM Towns: Free Software Collection 11 / FM Towns Free Software Collection 11.iso / t_os / tool / zc / src / tcom.c < prev    next >
Text File  |  1995-08-03  |  13KB  |  498 lines

  1. #include <stdio.h>
  2. #include "stdlib.h"
  3. #include "string.h"
  4. #include "egb.h"
  5. #include "FMCFRB.H"
  6. #include <msdos.cf>
  7.  
  8. /* #include "zc.h" */
  9.  
  10. #define  KBUF_SIZE    (640 * 480 * 2)
  11.  
  12. #define  SPACE_DELM 0
  13. #define  SPACE_SKIP 1
  14.  
  15. extern char gwork[];    /* グラフィックワ-ク */
  16. extern int svar[];
  17. extern char    *guiEgbPtr ;    /*    mov生成用ワークアドレス    */
  18. extern char    *rbuf ;        /*    mov生成用ワークアドレス    */
  19. extern char    *bbuf ;        /*    mov生成用ワークアドレス    */
  20. extern int pacRough;
  21. extern int idouMode;
  22. extern int pacFilter;
  23.  
  24. extern int mode;        /* 1=2色 4=16色 8=256色 16=32k色 */
  25. extern int ovr;            /* 重ね合わせ濃度    */
  26. extern int aflg;        /* 加算フラグ    */
  27. extern int sx,sy;        /* ズ-ム大きさ    */
  28. extern int ix,iy;        /* 読み込み位置    */
  29.  
  30. int Get_word();
  31.  
  32. int ComFile( char *filename, short int *kbuf)
  33. {
  34.     FILE    *fp;
  35.     char    word[80];
  36.     int    delm;
  37.     char    tracetext[80];
  38.     char    com;
  39.     char outfile[16], infile[16], prefix[80];
  40.     int outmode;
  41.     int fflg;
  42.     short int *twbuf;        /* きらきら用バッファ */
  43.     int  twflag, twvalue, twrange;
  44.  
  45.     if((fp = fopen(filename,"r")) == NULL){
  46.         return 0;
  47.     }
  48.  
  49.     memset( outfile, 0, sizeof(outfile));
  50.     memset( prefix,  0, sizeof(prefix) );
  51.     outmode = 0;
  52.  
  53.     /* コマンドファイル終了までのループ */
  54.     fflg = 0;
  55.     while(delm=Get_word(&fp, word, sizeof(word), SPACE_DELM), delm != EOF){
  56.         if( delm == EOF ){
  57.             break;
  58.         }
  59.         if( word[0] == '\0' ){
  60.             continue;
  61.         }
  62.  
  63.         if( delm == '(' ){ /* '?('の形ならwordはコマンド    */
  64.             com = word[0];
  65.             switch( com ){
  66.             case 'v':    /* v(動画ファイル名 ラフレ-ト,ソフトネス,    */
  67.             case 'V':    /*   左上X, 左上Y, 右下X, 右下Y) */
  68.                 /* 出力モード ラフレ-ト ソフトネス 録画範囲の初期値セット */
  69.                 outmode = 2;
  70.                 svar[0] = 0 ;
  71.                 svar[1] = 0 ;
  72.                 svar[2] = pacRough ;
  73.                 svar[3] = idouMode * 8 ;
  74.                 svar[4] = 0 ;
  75.                 svar[5] = 0 ;
  76.                 svar[6] = 319 ;
  77.                 svar[7] = 239 ;
  78.                 svar[11] = pacFilter ;
  79.                 rbuf = malloc(153600);
  80.                 memset( rbuf, 0, 153600);
  81.                 bbuf = malloc(524288);
  82.                 memset( rbuf, 0, 524288);
  83.                 guiEgbPtr = gwork;
  84.  
  85.                 /* 出力動画ファイル名 */
  86.                 delm = Get_word( &fp, outfile,  sizeof(outfile)-5, SPACE_SKIP);
  87.                 if( NULL == memchr(outfile, '.',sizeof(outfile)) ){
  88.                     strcat( outfile, ".mov");
  89.                 }
  90.                 sprintf(tracetext, "movfilename=%s\n", outfile);
  91.                 trace(tracetext);
  92.                 if( delm == ')' ){
  93.                     break;
  94.                 } else if( delm != ','){
  95.                     sprintf(tracetext,"m(動画ファイル名の次の文字が誤りです 文字=%c\n", delm);
  96.                     trace(tracetext);
  97.                     exit(-1);
  98.                 }
  99.  
  100.                 /* ラフレ-ト */
  101.                 delm = Get_word( &fp, word,  sizeof(word), SPACE_SKIP);
  102.                 if( word[0] != '\0' ){ /* 省略されていなければ変更 */
  103.                     pacRough = atoi(word);
  104.                     svar[2] = pacRough ;
  105.                 }
  106.                 if( delm == ')' ){
  107.                     break;
  108.                 } else if( delm != ','){
  109.                     sprintf(tracetext,"m(動画ファイル名,ラフレートの次の文字が誤りです 文字=%c\n", delm);
  110.                     trace(tracetext);
  111.                     exit(-1);
  112.                 }
  113.  
  114.                 /* ソフトネス */
  115.                 delm = Get_word( &fp, word,  sizeof(word), SPACE_SKIP);
  116.                 if( word[0] != '\0' ){ /* 省略されていなければ変更 */
  117.                     pacFilter = atoi(word);
  118.                     svar[11] = pacFilter ;
  119.                 }
  120.                 if( delm == ')' ){
  121.                     break;
  122.                 } else if( delm != ','){
  123.                     sprintf(tracetext,"m(動画ファイル名,ラフレート,ソフトネスの次の文字が誤りです 文字=%c\n", delm);
  124.                     trace(tracetext);
  125.                     exit(-1);
  126.                 }
  127.  
  128.                 /* 録画範囲(左上x) */
  129.                 delm = Get_word( &fp, word,  sizeof(word), SPACE_SKIP);
  130.                 if( word[0] != '\0' ){ /* 省略されていなければ変更 */
  131.                     svar[4] = atoi(word);
  132.                 }
  133.                 if( delm == ')' ){
  134.                     break;
  135.                 } else if( delm != ','){
  136.                     sprintf(tracetext,"m(動画ファイル名,ラフレート,ソフトネス,左上xの次の文字が誤りです 文字=%c\n", delm);
  137.                     trace(tracetext);
  138.                     exit(-1);
  139.                 }
  140.  
  141.                 /* 録画範囲(左上y) */
  142.                 delm = Get_word( &fp, word,  sizeof(word), SPACE_SKIP);
  143.                 if( word[0] != '\0' ){ /* 省略されていなければ変更 */
  144.                     svar[5] = atoi(word);
  145.                 }
  146.                 if( delm == ')' ){
  147.                     break;
  148.                 } else if( delm != ','){
  149.                     sprintf(tracetext,"m(動画ファイル名,ラフレート,ソフトネス,左上x, 左上yの次の文字が誤りです 文字=%c\n", delm);
  150.                     trace(tracetext);
  151.                     exit(-1);
  152.                 }
  153.  
  154.                 /* 録画範囲(右下x) */
  155.                 delm = Get_word( &fp, word,  sizeof(word), SPACE_SKIP);
  156.                 if( word[0] != '\0' ){ /* 省略されていなければ変更 */
  157.                     svar[6] = atoi(word);
  158.                 }
  159.                 if( delm == ')' ){
  160.                     break;
  161.                 } else if( delm != ','){
  162.                     sprintf(tracetext,"m(動画ファイル名,ラフレート,ソフトネス,左上x,左上y,右下xの次の文字が誤りです 文字=%c\n", delm);
  163.                     trace(tracetext);
  164.                     exit(-1);
  165.                 }
  166.  
  167.                 /* 録画範囲(右下y) */
  168.                 delm = Get_word( &fp, word,  sizeof(word), SPACE_SKIP);
  169.                 if( word[0] != '\0' ){ /* 省略されていなければ変更 */
  170.                     svar[7] = atoi(word);
  171.                 }
  172.                 if( delm != ')' ){
  173.                     sprintf(tracetext,"m(動画ファイル名,ラフレート,ソフトネス,左上x,左上y,右下x,右下yの次の文字が誤りです 文字=%c\n", delm);
  174.                     trace(tracetext);
  175.                     exit(-1);
  176.                 }
  177.                 break;
  178.  
  179.             case 'o':    /* o(出力TIFFファイル名)    */
  180.             case 'O':
  181.                 outmode = 1;
  182.                 delm = Get_word( &fp, outfile,  sizeof(outfile)-5, SPACE_SKIP);
  183.                 if( NULL == memchr(outfile, '.',sizeof(outfile)) ){
  184.                     strcat( outfile, ".tif");
  185.                 }
  186.                 if(delm != ')'){
  187.                     sprintf(tracetext,"o(出力TIFFファイル名の次の文字が誤りです 文字=%c\n", delm);
  188.                     trace(tracetext);
  189.                     exit(-1);
  190.                 }
  191.                 break;
  192.  
  193.             case 'p':    /* 入力TIFFファイル名のプレフィックス */
  194.             case 'P':
  195.                 delm = Get_word( &fp, prefix,  sizeof(prefix), SPACE_SKIP);
  196.                 if(delm != ')'){
  197.                     sprintf(tracetext,"p(入力TIFFファイル名プレフィックス の次の文字が誤りです 文字=%c\n", delm);
  198.                     trace(tracetext);
  199.                     exit(-1);
  200.                 }
  201.                 break;
  202.  
  203.             case 'l':    /* 濃度 */
  204.             case 'L':
  205.                 delm = Get_word( &fp, word,  sizeof(word), SPACE_SKIP);
  206.                 if(delm != ')'){
  207.                     sprintf(tracetext,"l(濃度 の次の文字が誤りです 文字=%c\n", delm);
  208.                     trace(tracetext);
  209.                     exit(-1);
  210.                 }
  211.  
  212.                 ovr = atoi( word );
  213.                 if( ovr < 0 || ovr > 256 ){
  214.                     sprintf(tracetext, "l(濃度の値が異常です0-256の範囲にして下さい 異常な値=%d)\n", ovr);
  215.                     trace( tracetext );
  216.                     exit( -1 );
  217.                 }
  218.                 break;
  219.  
  220.             case 'm':    /* 移動量    */
  221.             case 'M':
  222.                 /* X */
  223.                 delm = Get_word( &fp, word,  sizeof(word), SPACE_SKIP);
  224.                 if( word[0] == '\0'){
  225.                     trace("m(移動量のXが指定されていません\n");
  226.                     exit(-1);
  227.                 }
  228.                 if( delm == ')'){
  229.                     trace("m(移動量のYが指定されていません\n");
  230.                     exit(-1);
  231.                 }
  232.                 ix = atoi(word);
  233.  
  234.                 /* Y    */
  235.                 delm = Get_word( &fp, word,  sizeof(word), SPACE_SKIP);
  236.                 if( word[0] == '\0'){
  237.                     trace("m(移動量のYが指定されていません\n");
  238.                     exit(-1);
  239.                 }
  240.                 if( delm != ')'){
  241.                     sprintf(tracetext, "m(移動量のYの次の文字が誤りです 文字=%d\n", delm);
  242.                     trace( tracetext);
  243.                     exit(-1);
  244.                 }
  245.                 iy = atoi(word);
  246.                 break;
  247.  
  248.             case 'z':    /* 拡大/縮小 */
  249.             case 'Z':
  250.                 /* X */
  251.                 delm = Get_word( &fp, word,  sizeof(word), SPACE_SKIP);
  252.                 if( word[0] == '\0'){
  253.                     trace("z(拡大/縮小量のXが指定されていません\n");
  254.                     exit(-1);
  255.                 }
  256.                 if( delm == ')'){
  257.                     trace("z(拡大/縮小量のYが指定されていません\n");
  258.                     exit(-1);
  259.                 }
  260.                 sx = atoi(word);
  261.  
  262.                 /* Y    */
  263.                 delm = Get_word( &fp, word,  sizeof(word), SPACE_SKIP);
  264.                 if( word[0] == '\0'){
  265.                     trace("z(拡大/縮小量のYが指定されていません\n");
  266.                     exit(-1);
  267.                 }
  268.                 if( delm != ')'){
  269.                     sprintf(tracetext, "z(拡大/縮小量のYの次の文字が誤りです 文字=%d\n", delm);
  270.                     trace( tracetext);
  271.                     exit(-1);
  272.                 }
  273.                 sy = atoi(word);
  274.                 break;
  275.  
  276.             case 'w':
  277.             case 'W':
  278.                 twflag = 1;
  279.  
  280.                 /* 強さ */
  281.                 delm = Get_word( &fp, word,  sizeof(word), SPACE_SKIP);
  282.                 if( word[0] == '\0'){
  283.                     trace("w(透過光の強さが指定されていません\n");
  284.                     exit(-1);
  285.                 }
  286.                 if( delm == ')'){
  287.                     trace("w(透過光の大きさが指定されていません\n");
  288.                     exit(-1);
  289.                 }
  290.                 twvalue = atoi(word);
  291.  
  292.                 /* 大きさ */
  293.                 delm = Get_word( &fp, word,  sizeof(word), SPACE_SKIP);
  294.                 if( word[0] == '\0'){
  295.                     trace("w(透過光の大きさが指定されていません\n");
  296.                     exit(-1);
  297.                 }
  298.                 if( delm != ')'){
  299.                     sprintf(tracetext, "w(透過光の強さ,大きさの次の文字が誤りです 文字=%d\n", delm);
  300.                     trace( tracetext);
  301.                     exit(-1);
  302.                 }
  303.                 twrange = atoi(word);
  304.                 break;
  305.  
  306.             case 'a':
  307.             case 'A':
  308.                 delm = Get_word( &fp, word,  sizeof(word), SPACE_SKIP);
  309.                 if(delm != ')'){
  310.                     sprintf(tracetext,"a(加算合成フラグ の次の文字が誤りです 文字=%c\n", delm);
  311.                     trace(tracetext);
  312.                     exit(-1);
  313.                 }
  314.  
  315.                 aflg = atoi( word );
  316.                 if( aflg != 0 || aflg != 1 ){
  317.                     sprintf(tracetext, "a(0又は1以外の値が指定されています 異常な値=%d)\n", aflg);
  318.                     trace( tracetext );
  319.                     exit( -1 );
  320.                 }
  321.                 break;
  322.  
  323.             case 'b':
  324.             case 'B':
  325.                 twflag = 2;
  326.  
  327.                 delm = Get_word( &fp, word,  sizeof(word), SPACE_SKIP);
  328.                 if(delm != ')'){
  329.                     sprintf(tracetext,"b(暈しの程度 の次の文字が誤りです 文字=%c\n", delm);
  330.                     trace(tracetext);
  331.                     exit(-1);
  332.                 }
  333.  
  334.                 twvalue = atoi(word);
  335.                 if( twvalue < 0 || twvalue > 256 ){
  336.                     sprintf(tracetext, "l(暈しの程度の値が異常です.0-256の範囲にして下さい 異常な値=%d)\n", twvalue);
  337.                     trace( tracetext );
  338.                     exit( -1 );
  339.                 }
  340.                 break;
  341.  
  342.             }
  343.         } else { /* デリミタが'('以外なら wordがファイル名    */
  344.             /***************************************************
  345.               ファイル->GVRAM
  346.               ****************************************************/
  347.             memset( infile, 0, sizeof(infile));
  348.             strcpy( infile, prefix );
  349.             strcat( infile, word );
  350.             
  351.             FileToGvram( infile, &mode, ix, iy );
  352.  
  353.             /***************************************************
  354.               GVRAM -> 重ね合わせ用バッファ
  355.               ***************************************************/
  356.             switch( twflag ){
  357.             case 0:    /* 普通の処理 */
  358.                 GvramToBuf( kbuf );
  359.                 break;
  360.             case 1:    /* クロスフィルタ-付き透過光    */
  361.                 twbuf = (short int*)malloc( KBUF_SIZE );
  362.                 if( kbuf == NULL){
  363.                     trace("Fail to malloc twbuf");
  364.                     exit( -1 );
  365.                 }
  366.                 _fill_char( twbuf, KBUF_SIZE, 0 );
  367.                 GvramToBuf( twbuf );
  368.  
  369.                 twinkle( twbuf, kbuf, twvalue, twrange );
  370.  
  371.                 twflag = 0;
  372.                 free( twbuf );
  373.                 break;
  374.             case 2:    /* 暈し処理    */
  375.                 twbuf = (short int*)malloc( KBUF_SIZE );
  376.                 if( kbuf == NULL){
  377.                     trace("Fail to malloc twbuf");
  378.                     exit( -1 );
  379.                 }
  380.                 _fill_char( twbuf, KBUF_SIZE, 0 );
  381.                 GvramToBuf( twbuf );
  382.  
  383.                 Gradate( twvalue, kbuf );
  384.  
  385.                 twflag = 0;
  386.                 free( twbuf );
  387.                 break;
  388.             }
  389.         }
  390.  
  391.         if( delm == ';'){
  392.             /***************************************************
  393.               GVRAM -> ファイル
  394.               ****************************************************/
  395.             sprintf(tracetext, "before BufToFile=%s\n", outfile);
  396.             trace(tracetext);
  397.             BufToFile(outmode, outfile, kbuf);
  398.             sprintf(tracetext, "after BufToFile=%s\n", outfile);
  399.             trace(tracetext);
  400.  
  401.             fflg = 1;
  402.             aflg = 0;
  403.             ovr  = 256;
  404.             ix = 0;
  405.             iy = 0;
  406.             _fill_char( kbuf, KBUF_SIZE, 0 );
  407.         }
  408.     }
  409.     fclose(fp);
  410.     return fflg;
  411. }
  412.  
  413. /***************************************************************************
  414.   ファイルから単語を切り出す
  415. **************************************************************************/
  416. int Get_word( fp, word, size, smode )
  417. FILE        **fp;
  418. char        *word;
  419. unsigned int size;    /* word配列の大きさ */
  420. int            smode;    /* 1..スペース,改行で単語が終ったら次に現れたスペース以外の文字を探してその文字をデミリタとして返す 0..スペース,改行は普通のデミリタ */
  421. {
  422.     int inp, tmp;
  423.     int i;
  424.     char tracetext[160];
  425.     int  delm;
  426.     
  427.     /* スペースをスキップ */
  428.     do{
  429.         inp = fgetc( *fp );
  430.     }while( inp == ' ' );
  431.    
  432.     /* デミリタ又が現れるまで単語とみなす */
  433.     i = 0;
  434.     while(i < size){
  435.         switch(inp){
  436.         case '/':
  437.             tmp = inp;
  438.             inp = fgetc( *fp );
  439.             switch( inp ){
  440.             case '/':
  441.                 /* コメント読み飛ばす処理(行末まで) */
  442.                 do{
  443.                     inp = fgetc( *fp );
  444.                 }while( inp != '\n' );
  445.                 continue;
  446.             case '*':
  447.                 /* コメント読み飛ばす処理(コメントおわりまで) */
  448.                 SKIP_LOOP:
  449.                 do{
  450.                     inp = fgetc( *fp );
  451.                 }while( inp != '*' );
  452.                 inp = fgetc( *fp );
  453.                 if( inp != '/'){
  454.                     goto SKIP_LOOP;
  455.                 }
  456.                 inp = fgetc( *fp );
  457.                 continue;
  458.             default:
  459.                 word[i] = (char)tmp;
  460.                 i ++;
  461.                 word[i] = (char)inp;
  462.                 i ++;
  463.                 inp = fgetc(*fp);
  464.                 continue;
  465.             }
  466.  
  467.         case ' ':
  468.         case '\n':
  469.             if (smode == 1){
  470.                 /*スペース,改行をスキップして見付けた文字をデミリタとして返す*/
  471.                 do{
  472.                     inp = fgetc( *fp );
  473.                 }while( inp == ' ' );
  474.             }
  475.         case '(':
  476.         case ')':
  477.         case ',':
  478.         case ';':
  479.         case EOF:
  480.             delm = inp;
  481.             word[i] = '\0';
  482. trace("Get_word return:");
  483. trace(word);
  484.             return delm;
  485.         }
  486.         word[i] = (char )inp;
  487.         i ++;
  488.         inp = fgetc(*fp); 
  489.     }
  490.  
  491.     /* 1単語がsize以上ならエラー */
  492.     *(word + size) = '\0';
  493.     sprintf(tracetext, "単語の長さが長過ぎます 単語=%s\n", word);
  494.     trace( tracetext );
  495.     exit( -1 );
  496.     return '\0';
  497. }
  498.